{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<center> <h1>Using GraphWave </h1> </center>\n",
    "\n",
    "&nbsp;\n",
    "\n",
    "&nbsp;\n",
    "\n",
    "The goal of the  following notebook is to show how the GraphWave algorithm can be used. \n",
    "\n",
    "GraphWave was implemented in Python 2.7 and requires to load the following Python packages:\n",
    "\n",
    "+ __networkx__ (for handling network objects: in particular, visualization, etc.)\n",
    "+ traditional libraries for data analytics: \n",
    "    + __seaborn__ for plotting\n",
    "    + __pandas__ for dataframes\n",
    "    + __sklearn__ for analytics\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import networkx as nx \n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import seaborn as sb\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.cluster import KMeans\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import Graphwave\n",
    "from Graphwave.shapes import build_graph\n",
    "from Graphwave.graphwave import *\n",
    "\n",
    "\n",
    "np.random.seed(123)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## I. Creating a graph"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 1- Start by defining our favorite regular structure\n",
    "\n",
    "width_basis = 15\n",
    "nbTrials = 20\n",
    "\n",
    "\n",
    "################################### EXAMPLE TO BUILD A SIMPLE REGULAR STRUCTURE ##########\n",
    "## REGULAR STRUCTURE: the most simple structure:  basis + n small patterns of a single type\n",
    "\n",
    "### 1. Choose the basis (cycle, torus or chain)\n",
    "basis_type = \"cycle\" \n",
    "\n",
    "### 2. Add the shapes \n",
    "n_shapes = 5  ## numbers of shapes to add \n",
    "#shape=[\"fan\",6] ## shapes and their associated required parameters  (nb of edges for the star, etc)\n",
    "#shape=[\"star\",6]\n",
    "list_shapes = [[\"house\"]] * n_shapes\n",
    "\n",
    "### 3. Give a name to the graph\n",
    "identifier = 'AA'  ## just a name to distinguish between different trials\n",
    "name_graph = 'houses'+ identifier\n",
    "sb.set_style('white')\n",
    "\n",
    "### 4. Pass all these parameters to the Graph Structure\n",
    "add_edges = 0\n",
    "G, communities, _ , role_id = build_graph.build_structure(width_basis, basis_type, list_shapes, start=0,\n",
    "                                       add_random_edges=add_edges, plot=True,\n",
    "                                       savefig=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(Note: best visualization of the graphs are obtained using Gephi, or some other specialized graph visualization software)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## II. Running GraphWave\n",
    "\n",
    "\n",
    "We propose here a simple demonstration of GraphWave using both the automatic version (part a) and the manual version. This shows how to use GraphWave in a parameter-free version, or giving the analyst the possibility to select an adequate scale value.\n",
    "\n",
    "For each of these approaches, we compute the signature by calling GraphWave. We then compute its PCA projection to visualize the embeddings. Note that in this very simple examples, GraphWave recovers structura equivalence, as shown by the overlapping embeddings on the first principal components.\n",
    "\n",
    "#### a. Multiscale GraphWave: Automatic selection of the range of scales"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "chi,chi1, heat_print, taus = graphwave_alg(G, np.linspace(0,100,25), taus='auto', verbose=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We now visualize the resulting embeddings by computing their PCA projections. We also run KMeans to assess how well the signatures that we have here generated enable the recovery of structural roles."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXMAAAD7CAYAAACYLnSTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAFXRJREFUeJzt3X10VPWBxvFn8k4IECERBMvLKAlCRd4WtBUwuhHfWDUlNsDBg1DRLqeIYBBZiLwo4BYttSjhULTIUqEgCF2rVhQBLYuIAibUQYnG06gRFIQhQCbJ3T8ikYCYyc2duZNfvh8OJ3Nf5t6HnPj4y2/unfFYlmUJANCoRbkdAADQcJQ5ABiAMgcAA1DmAGAAyhwADECZA4ABKHMAMABlDgAGoMwBwAAx4TrRgAED1KFDh3CdDgCMUFJSoh07dtS5X9jKvEOHDlq3bl24ToczrB0h3fSklJjidhIA9ZWVlRXUfkyzGO7QAanweWlpf7eTAAglytxwf/mP6q9HPnE3B4DQoswNd3Df949LC6q/Dh48WOnp6UpPT9dll12msrKymn3GjRun9PT0MKcE0FCUucG+/aL28pph0v79+/Xll19q/fr18vl8sixLv/jFLyRJvXr10pYtW1xICqChKHODrR5ae/lrn3TxxRfr0UcfVffu3SVJlmUpISFBkpSSkqIxY8aEOyYAB4TtahaERiAgPZ0unTp67rYTX5+7blHHREnD9N/3Ss9d0FfySP22/UUfrJY2bdqkRYsWhTwzAOdR5gYI5sXN5y/9qSxPQJKU9dE7Wn/pVbI8lRry6XpVBGL1ySbp8l+GOCiAkKHMG7nYWCn3iPT4hVJV+fn3G/5xQc3jP3ftJsmj7I/eV6wSNeR30pUTQ58VQOgwZ26AxFbSjFNSl+vq3ndruwmSLElVWtO1t/6clq68v10f6ogAQswTrg90zsrK4g7QMPC9JK26pe79vNdLo14NfR4ADRNsdzIyN0z6zdIlN9Sxk4ciB0xja848EAho6tSpKikpUVRUlObMmaNLLrnE6Wyw6cBrdexgSYEyKTYxLHEAhIGtkfmWLVtUUVGhVatWafz48Vq4cKHTuWBTICCpsu79/hzEVAyAxsNWmXfp0kWVlZWqqqqS3+9XTAwXxUSK9SPOWhEljf9YSrms9upPudETMIqtFk5MTFRJSYluvPFGHT58WPn5+U7ngk0fvvj949Tu0n8WVj8ev0/6v4XSq/d/t7GqehQfGxv2iABCwNbI/E9/+pOuvvpqvfrqq9qwYYOmTp2qU6dOOZ0NNlgV1V9vWPR9kZ925cTqa9Kj46uXXxkf3mwAQsfWyLxly5aK/W5I16pVK1VUVKiyMoiJWoTcz6dKP5tafe35D0lsJU0/Kb05W+p9d3izAQgdW2U+evRoTZs2TSNGjFAgEND999+vxEQujYgE/z4vuP2uyQttDgDhZavMmzdvrt///vdOZwEA2MRNQwBgAMocAAxAmQOAAShzADAAZQ4ABqDMAcAAlDkAGIAyBwADUOYAYADKHAAMQJkDgAEocwAwAGUOAAagzAHAAJQ5ABiAMgcAA1DmAGAAyhwADECZA4ABbH0GqCQtWbJEb7zxhgKBgIYPH67s7GwncwEA6sFWme/YsUPvv/++nn/+eZ04cULPPPOM07kAAPVgq8zfeustpaWlafz48fL7/ZoyZYrTuQAA9WCrzA8fPqzPP/9c+fn5+te//qVf//rXeuWVV+TxeJzOBwAIgq0yT05OltfrVVxcnLxer+Lj4/XNN9+oTZs2TucDAATB1tUsffv21bZt22RZlkpLS3XixAklJyc7nQ0AECRbI/OMjAzt3LlTw4YNk2VZysvLU3R0tNPZAABBsn1pIi96AkDk4KYhADAAZQ4ABqDMAcAAlDkAGIAyBwADUOYAYADKHABCpLBolgqLZoXlXJQ5ABjA9k1DAIDglJaWavDgwbIsS5Lk9XqVkZGhZcuWSZKioqK0a9cuJSYmqkePHqqoqJBU/T5YHTp0COocjMwBIMRuv/12RUVFyefz6cknn1RRUZGWLVumPn36yOfzSZJuu+025eTkqKKiQj6fT6+99pqOHDmib7/9NqhzMDIHgBB76qmnVFlZec765557TpLUqVMnFRcXKz8/X8XFxZKkmJiYWl/rQpkDQIj17t1bkvTuu+9qwoQJatu2rUpLSxUbGytJatmypSzLktfrldfrVWlpqa699lolJCSoefPmQZ2DaRYACIOlS5dq5MiRat26tbZu3Vpr29GjR2s+3Gfz5s0aNGiQ4uLitGfPnqCPT5kDQIitXbtWCxYs0BVXXKHt27fXrB8+fLgkqbi4WO3atdP+/ft17733qm3bttq7d2+9zsE0CwCEWF5eniRpz549Sk9PlyQNHTpUf/3rX5Weni6Px6MXX3xRGRkZkqqvfjm9X0pKSlDnoMwBIMT27dv3g+sXLFhQa/m99947Z5+srKygzsE0CwAYgDIHAANQ5gBggAaV+ddff63BgwfrwIEDTuUBANhgu8wDgYDy8vKUkJDgZB4AgA22y/yxxx5TTk6OLrzwQifzAABssFXm69atU+vWrTVw4ECn8wAAbLB1nfkLL7wgj8ej7du365///KcefPBBLV68WKmpqU7nA4BGq4f34bCdy1aZr1y5subxqFGjNHPmTIocAFzEpYkAYIAG386/YsUKJ3IAABqAkTkAGIAyBwADUOYAYADKHAAMQJkDgAEocwAwAGUOAAaI+DKfrZc0Ty+7HQMAIlrEl7kkBVTldgQAiGgRXeZPaXPN423a72ISAIhsDb6dP5S+VpkkqezQN/rVz4fWrL/88su1du1at2IBQMSJ6JH5aS8OmitJ8vl8Sk5O1gcffOByIgCILBFb5ku1reaxVVkleaR39Yl27NjhYioAiEyuT7PM1ktB7eeJjdbftE9/0z5J0oSP/qiUrhfVbM/TzSHJBwCNgesj80TFBrWfVVH7ipYzi7ydWjiaCQAaG9dH5g/oem3Tfm3WR+fdxxMdVT3VIukvA6bX2jZS/XWJ+JQjAE2b6yNzSRqoND2gjPNuv23rNEnSyvRJChwpU8uubRUlj/J0M0UOAIqAkflpiUpUnm5WvrboK/lrb0tprZG+J2qWL1M7ZatvuCMCQMSKiJH5mS5UUp37DFCnMCQBgMbDVpkHAgHl5uZqxIgRGjZsmF5//XXHAhXoyzr3WaF3HDsfAJjA1jTLxo0blZycrN/+9rc6fPiwbr/9dl133XVOZzuvSllhOxcANAa2yvyGG27QkCFDapajo6MdCfOyzr2z8/QLowvOeJ8WSTqkI0pRsiPnBYDGztY0S/PmzZWUlCS/368JEyZo4sSJjoTZqc9qHrdVkvJ0sxK/+5Onm9XsjGvSl2q7I+cEABPYfgH0iy++0J133qlbb71VQ4cOrfsJ9TBS/XWPBp+zPlfXK0NdJfG2uABwJlvTLIcOHdKYMWOUl5enq666yrEwwdySP1BpGqg0x84JACawNTLPz8/X0aNH9fTTT2vUqFEaNWqUTp486XQ2AECQbI3Mp0+frunTp9e9IwAgLCLupiEAQP1R5gBgAMocAAxAmQOAAShzADAAZQ4ABqDMAcAAlDkAGIAyBwADUOYAYADKHAAMQJkDgAEocwAwAGUOAAagzAHAAJQ5ABiAMgcAA1DmAGAAyhwADGDrM0AlqaqqSjNnzpTP51NcXJweeeQRderUyclsAIAg2R6Zb9q0SeXl5Vq9erUmT56s+fPnO5kLAFAPtst8165dGjhwoCSpV69eKigocCwUAKB+bJe53+9XUlJSzXJ0dLQqKiocCQUAqB/bZZ6UlKTjx4/XLFdVVSkmxvYUPACgAWyXeZ8+fbR161ZJ0u7du5WWluZYKABA/dgeSmdmZurtt99WTk6OLMvS3LlzncwFAKgH22UeFRWl2bNnO5kFAGATNw0BgAEocwAwAGUOAAagzAHAAJQ5ABiAMgcAA1DmAGAAyhwADECZA4ABKHMAMABlDgAGoMwBwACUOQAYgDIHAANQ5gBgAMocAAxAmQOAAShzADAAZQ4ABrD1GaDHjh1Tbm6u/H6/AoGApk6dqt69ezudDQAQJFtl/uyzz+rKK6/U6NGjVVRUpMmTJ2v9+vVOZwMABMlWmY8ePVpxcXGSpMrKSsXHxzsaCgBQP3WW+Zo1a7R8+fJa6+bOnauePXvq4MGDys3N1bRp00IWEABQtzrLPDs7W9nZ2ees9/l8mjRpkqZMmaL+/fuHJBwA513+8EnHjvXBrATHjoWGsTXN8vHHH+u+++7TwoUL1a1bN6czAQDqyVaZP/744yovL9ejjz4qSUpKStLixYsdDQbAPYGyg7I2Zkqyqle06Ky4mze4mgk/zlaZU9yA2axX75AUpbic9xQo/rus7bluR0IdbJU5ALN5rl4oWRVux0A9UOYAzhGbeoUkKfDVrupRebO2LidCXShzAD8osO9ZWXsXSvEXKO7Wv7sdB3XgvVkAnCNwYH11kbf+qeJuf9PtOAgCZQ7gHNbO2dUPvilQ+aorVL7qCgWOfORuKPwoplkAnCMu5323I6CeGJkDgAEocwAwAGUOAAagzAHAAJQ5ABiAMgcAA1DmAGAAyhwADMBNQ0ATw6cDmYmROQAYgDIHAANQ5gBggAaV+YEDB9S3b1+dOnXKqTwAABtsl7nf79djjz2muLg4J/MAAGywVeaWZWnGjBmaNGmSmjVr5nQmAEA91Xlp4po1a7R8+fJa69q3b6+bbrpJ3bp1C1kw4LSysjLtrKrSv0VFKTEx0e04QETyWJZl1fdJmZmZateunSRp9+7d6tmzp1auXPmjz8nKytK6devspUSTs+nYMd138OB5t1+XkKAn27cPYyLAHcF2p62bhl577bWax9dee62eeeYZO4cBznGorEyDv/yyzv1eP3lSPYqKNLZFC01KTQ1DMiCycQcoIsbHZWW69UeKvOKLL6QxY75fkZ6uZQsXan95ufI7dAhDQiByNfg68zfeeEPx8fFOZEETVlZHkUuSfvUrSVLMyy9LCQmSzydJ2nbqlBYfOhTqiEBE46YhRIRrg5haiXnpJWnJkuqFkydrbVt09GgoYgGNBmWOiHAsyP1iOnZUxY03Vi+cdY/DFr/f2VBAI0KZw3X/FcSo/EwxL78sXXONVF6uijNejB//1VcOJwMaD8ocrnuxrCyo/SpuvPH7Ufmll1Z/bdWqZnu9r7EFDEKZo/GYNElSdanrj3+UoqMV07+/y6GAyMCliWg0YjIzpcxMt2MAEYmROQAYgDKH67rE8Asi0FD8V1QfezdL2/6n4ce5uId066SGH8cQ/9uxo3oUFTX4OCObN3cgDdA4Ueb18coi6fjhhh/nq08o87NES6ps4DGmtW3rRBSgUWKapT7u+p0zx+nSx5njGGTVd+/CaVc3pmrQxFHm9ZHaUYoL/sM41hf5lb6qRLPfPWs0P3qBw8Eav+6JiRrbooWt5zaX9ELHjs4GAhoZyry+xi0OarfSsoCmvvPtuRsYlZ/XpNRUTTzjJqBgXBgVpXe83hAlAhoPyry+ghydZ2z8Spcl/8Cv/ozKf9Tdbdqo0OvVhVE//qMZLWlDu3ba3LlzWHIBkY4yt6OO0fnP1n+umCjpxRvOekGOUXnQNnfurEKvVxNbtVJqVJSaSUr2eDQwPl6FXq/2er26lI+QA2rwqpEdp0fn5Sd+cPPXp6rfJSR9VYkkaeXHZUpvFatfzmJUXl93t2mju9u0cTsGEPEYmdv1I6NzX06Hmr+SNPLSRP3y+kHhSgagCaLM7arnlS3MlQMIJcq8IYK4ssWX00F52deFIQyApszWnHllZaXmzZungoIClZeX6ze/+Y0yMjKczhb56pg7r8GoHECI2RqZb9iwQRUVFVq1apUWL16s4uJip3M1HnWNzrmCBUAY2BqZv/XWW0pLS9O4ceNkWZZmzJjhdK7Go67ROaNyAGFQZ5mvWbNGy5cvr7XuggsuUHx8vJYsWaKdO3fqoYce0sqVK0MWMuKNWywtGn3uekblAMKkzjLPzs5WdnZ2rXX333+/rrnmGnk8HvXv31+ffvppqPI1DucbnTMqBxAmtubM+/btqy1btkiSPvzwQ1100UWOhmqUzp47Z1QOIIxslfkdd9why7J0xx13aMaMGZo1a5bTuRqfs687Z1QOIIxsvQAaFxenefPmOZ2l8Ts9d+7t53YSAE0M783ipNSO0vRXpdhYt5MAaGK4A9RpFDkAF1DmAGAAyhwADECZA4ABKHMAMABlDgAGoMwBwACUOQAYIGw3DZWUlCgrKytcpwMAI5SUlAS1n8eyLCvEWQAAIcY0CwAYgDIHAANQ5gBgAMocAAxAmQOAAXg/8xCyLEuDBg1S586dJUm9evXS5MmT3Q0VZlVVVZo5c6Z8Pp/i4uL0yCOPqFOnTm7HctVtt92mFi1aSJIuvvjiJvlBL3v27NGCBQu0YsUKFRcXa+rUqfJ4POratasefvhhRUU1nXHmmd+LwsJC3XvvvTWdMXz4cN10001BHYcyD6HPPvtMPXr0UH5+vttRXLNp0yaVl5dr9erV2r17t+bPn6/FixfX/URDnTp1SpK0YsUKl5O4Z+nSpdq4caOaNav+mMV58+Zp4sSJGjBggPLy8vT6668rMzPT5ZThcfb3Yt++fbrrrrs0ZsyYeh+r6fzvzwWFhYUqLS3VqFGjdPfdd6uoqMjtSGG3a9cuDRw4UFL1byYFBQUuJ3LXhx9+qBMnTmjMmDG68847tXv3brcjhV3Hjh31hz/8oWa5sLBQ/fv3lyQNGjRI//jHP9yKFnZnfy8KCgr05ptvauTIkZo2bZr8fn/Qx6LMHbJmzRrdcssttf6mpKRo3LhxWrFihe655x7l5ua6HTPs/H6/kpKSapajo6NVUVHhYiJ3JSQkaOzYsVq2bJlmzZqlBx54oMl9P4YMGaKYmO8nBSzLksfjkSQ1b95cx44dcyta2J39vejZs6emTJmilStX6ic/+YmeeuqpoI/FNItDsrOzlZ2dXWvdiRMnFB0dLUnq16+fSktLa/3gNgVJSUk6fvx4zXJVVVWtH96mpkuXLurUqZM8Ho+6dOmi5ORkHTx4UBdddJHb0Vxz5vz48ePH1bJlSxfTuCszM7Pm35+Zmak5c+YE/VxG5iG0aNEiLV++XFL1r9ft27dvUkUuSX369NHWrVslSbt371ZaWprLidy1du1azZ8/X5JUWloqv9+v1NRUl1O5q3v37tqxY4ckaevWrerXr5/LidwzduxY7d27V5K0fft29ejRI+jnNt0hUhiMGzdOubm52rJli6Kjo5vkVQuZmZl6++23lZOTI8uyNHfuXLcjuWrYsGF66KGHNHz4cHk8Hs2dO7dJ/6YiSQ8++KBmzJihJ554Ql6vV0OGDHE7kmtmzpypOXPmKDY2VikpKfUamfNGWwBgAKZZAMAAlDkAGIAyBwADUOYAYADKHAAMQJkDgAEocwAwAGUOAAb4f0pkPFs+bipbAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "nb_clust = len(np.unique(role_id))\n",
    "pca = PCA(n_components=5)\n",
    "trans_data = pca.fit_transform(StandardScaler().fit_transform(chi))\n",
    "km = KMeans(n_clusters=nb_clust)\n",
    "km.fit(trans_data)\n",
    "labels_pred=km.labels_\n",
    "\n",
    "######## Params for plotting\n",
    "cmapx=plt.get_cmap('rainbow')\n",
    "x=np.linspace(0,1,nb_clust+1)\n",
    "col=[cmapx(xx) for xx in x ]\n",
    "markers = {0:'*',1: '.', 2:',',3: 'o',4: 'v',5: '^',6: '<',7: '>',8: 3 ,9:'d',10: '+',11:'x',12:'D',13: '|',14: '_',15:4,16:0,17:1,18:2,19:6,20:7}\n",
    "\n",
    "for c in np.unique(role_id):\n",
    "    indc = [i for i,x in enumerate(role_id) if x==c]\n",
    "    plt.scatter(trans_data[indc,0], trans_data[indc,1],\n",
    "                c=np.array(col)[list(np.array(labels_pred)[indc])],\n",
    "                marker=markers[c%len(markers)], s=300)\n",
    "\n",
    "labels = role_id\n",
    "for label,c, x, y in zip(labels,labels_pred, trans_data[:, 0], trans_data[:, 1]):\n",
    "            plt.annotate(label,xy=(x, y), xytext=(0, 0), textcoords='offset points')\n",
    "            "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Uniscale GraphWave: Hand-selected value for tau"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.        ,  0.1010101 ,  0.2020202 ,  0.3030303 ,  0.4040404 ,\n",
       "        0.50505051,  0.60606061,  0.70707071,  0.80808081,  0.90909091,\n",
       "        1.01010101,  1.11111111,  1.21212121,  1.31313131,  1.41414141,\n",
       "        1.51515152,  1.61616162,  1.71717172,  1.81818182,  1.91919192,\n",
       "        2.02020202,  2.12121212,  2.22222222,  2.32323232,  2.42424242,\n",
       "        2.52525253,  2.62626263,  2.72727273,  2.82828283,  2.92929293,\n",
       "        3.03030303,  3.13131313,  3.23232323,  3.33333333,  3.43434343,\n",
       "        3.53535354,  3.63636364,  3.73737374,  3.83838384,  3.93939394,\n",
       "        4.04040404,  4.14141414,  4.24242424,  4.34343434,  4.44444444,\n",
       "        4.54545455,  4.64646465,  4.74747475,  4.84848485,  4.94949495,\n",
       "        5.05050505,  5.15151515,  5.25252525,  5.35353535,  5.45454545,\n",
       "        5.55555556,  5.65656566,  5.75757576,  5.85858586,  5.95959596,\n",
       "        6.06060606,  6.16161616,  6.26262626,  6.36363636,  6.46464646,\n",
       "        6.56565657,  6.66666667,  6.76767677,  6.86868687,  6.96969697,\n",
       "        7.07070707,  7.17171717,  7.27272727,  7.37373737,  7.47474747,\n",
       "        7.57575758,  7.67676768,  7.77777778,  7.87878788,  7.97979798,\n",
       "        8.08080808,  8.18181818,  8.28282828,  8.38383838,  8.48484848,\n",
       "        8.58585859,  8.68686869,  8.78787879,  8.88888889,  8.98989899,\n",
       "        9.09090909,  9.19191919,  9.29292929,  9.39393939,  9.49494949,\n",
       "        9.5959596 ,  9.6969697 ,  9.7979798 ,  9.8989899 , 10.        ])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.linspace(0,10,100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "ename": "ImportError",
     "evalue": "No module named graphwave.graphwave",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mImportError\u001b[0m                               Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-12-ff5d99608d0b>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      4\u001b[0m \u001b[1;31m### Compute the heat wavelet\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 5\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mgraphwave\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mgraphwave\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[1;33m*\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      6\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      7\u001b[0m \u001b[0mtime_pts\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m50\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m0.5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mImportError\u001b[0m: No module named graphwave.graphwave"
     ]
    }
   ],
   "source": [
    "### Select a scale of interest (here we select a particular range of scale. See associated paper for \n",
    "### guidelines on how to select the appropriate scale.)\n",
    "\n",
    "### Compute the heat wavelet\n",
    "from Graphwave.graphwave import *\n",
    "\n",
    "time_pts = list(np.arange(0,50,0.5))\n",
    "chi,heat_print, taus=graphwave_alg(G, np.linspace(0,10,100), taus=[1.0], verbose=True) \n",
    "print(chi.shape, len(time_pts))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that in the EPFL implementation, by construction, the wavelet scales are all divided by the maximum eigenvalue $\\lambda_N$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "nb_clust=len(np.unique(role_id))\n",
    "pca=PCA(n_components=5)\n",
    "trans_data=pca.fit_transform(StandardScaler().fit_transform(chi))\n",
    "km=KMeans(n_clusters=nb_clust)\n",
    "km.fit(trans_data)\n",
    "labels_pred=km.labels_\n",
    "\n",
    "\n",
    "cmapx=plt.get_cmap('rainbow')\n",
    "x=np.linspace(0,1,np.max(labels_pred)+1)\n",
    "col=[cmapx(xx) for xx in x ]\n",
    "markers = {0:'*',1: '.', 2:',',3: 'o',4: 'v',5: '^',6: '<',7: '>',8: 3 ,9:'d',10: '+',11:'x',12:'D',13: '|',14: '_',15:4,16:0,17:1,18:2,19:6,20:7}\n",
    "\n",
    "\n",
    "for c in np.unique(role_id):\n",
    "        indc=[i for i,x in enumerate(role_id) if x==c]\n",
    "        _ = plt.scatter(trans_data[indc,0], trans_data[indc,1],c=np.array(col)[list(np.array(labels_pred)[indc])] ,marker=markers[c%len(markers)],s=500)\n",
    "\n",
    "labels = role_id\n",
    "for label,c, x, y in zip(labels,labels_pred, trans_data[:, 0], trans_data[:, 1]):\n",
    "            _ = plt.annotate(label,xy=(x, y), xytext=(0, 0), textcoords='offset points')\n",
    "            "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## III. Visualizing the Characteristic functions\n",
    "\n",
    "We now propose to show how to visualize characteristic functions.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "mapping = {u: i for i,u in enumerate(np.unique(role_id))}\n",
    "cmap=plt.get_cmap('gnuplot')\n",
    "role_id_plot=[cmap(x) for x in np.linspace(0,1,len(np.unique(role_id)))]\n",
    "plt.figure()\n",
    "ind_x=range(chi[0].shape[0])[0::2]\n",
    "ind_y=range(chi[0].shape[0])[1::2]\n",
    "for i in np.random.choice(range(G.number_of_nodes()),10,replace=False):\n",
    "    _ = plt.plot(chi[i, ind_x],chi[i, ind_y],label=str(i),color=role_id_plot[mapping[role_id[i]]])\n",
    "\n",
    "_ = plt.legend(loc='center left',bbox_to_anchor=(1,0.5))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 1.          0.          0.94761912 ...  0.04082127  0.68845376\n",
      "   0.0413003 ]\n",
      " [ 1.          0.          0.94752024 ...  0.04968502  0.79172632\n",
      "   0.08296395]\n",
      " [ 1.          0.          0.94752024 ...  0.04968502  0.79172632\n",
      "   0.08296395]\n",
      " ...\n",
      " [ 1.          0.          0.94834221 ...  0.05320764  0.81176559\n",
      "   0.01418995]\n",
      " [ 1.          0.          0.94834221 ...  0.05320764  0.81176559\n",
      "   0.01418995]\n",
      " [ 1.          0.          0.9487307  ...  0.05659035  0.76760702\n",
      "  -0.00274125]]\n"
     ]
    }
   ],
   "source": [
    "print chi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'numpy.matrixlib.defmatrix.matrix'>\n"
     ]
    }
   ],
   "source": [
    "print(type(chi))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(40L, 100L)\n"
     ]
    }
   ],
   "source": [
    "print chi.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "ename": "IndexError",
     "evalue": "shape mismatch: indexing arrays could not be broadcast together with shapes (3,) (2,) ",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mIndexError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-16-187e620c631e>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mchi\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;32mD:\\Anaconda\\envs\\py2\\lib\\site-packages\\numpy\\matrixlib\\defmatrix.pyc\u001b[0m in \u001b[0;36m__getitem__\u001b[1;34m(self, index)\u001b[0m\n\u001b[0;32m    188\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    189\u001b[0m         \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 190\u001b[1;33m             \u001b[0mout\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mN\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__getitem__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mindex\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    191\u001b[0m         \u001b[1;32mfinally\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    192\u001b[0m             \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_getitem\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mFalse\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mIndexError\u001b[0m: shape mismatch: indexing arrays could not be broadcast together with shapes (3,) (2,) "
     ]
    }
   ],
   "source": [
    "chi[[1,2,3],[1,2]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "matrix([[0.        , 0.94752024]])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "chi[1,[1,2]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "a=chi[1,[1,2]]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "matrix([[0.        , 0.94752024]])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1L, 2L)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(a,a)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(a[0],a[0])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
